package com.item;

/**
 * Hashset底层原理
 * HashSet底层是数组+链表+（结合哈希算法）
 * ①创建一个默认长度16的数组，数组名table
 * ②根据元素的哈希值跟数组的长度求余计算出应存入的位置（哈希算法）
 * ③判断当前位置是否为null，如果是null则直接存入
 * ④如果位置不为null，表示有元素，则调用equals方法比较
 * ⑤如果一样则不存，如果不一样则存入
 */

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.function.Consumer;

public class HashSetDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张三");
        list.add("张三");
        list.add("张三");
        System.out.println(list);

        ArrayList<String> newList = new ArrayList<>(new HashSet<>(list));//去重
        System.out.println(newList);
        //1.创建HashSet对象
        HashSet<String> hashSet = new HashSet<>();
        //2.保存数据
        hashSet.add("张三");
        hashSet.add("李四");
        hashSet.add("王五");
        hashSet.add("王五");
        hashSet.add("王五");
        hashSet.add("赵六");
        System.out.println(hashSet);
        //3.取数据(迭代器)
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            System.out.println(next);
        }
//        for (int i = 0; i < hashSet.size(); i++){
//        }//用不了！
        //4.取数据（增强for循环）
        for(String name : hashSet){
            System.out.println("name="+name);
        }
        //5.取数据（Lambda表达式）
        hashSet.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });

        hashSet.forEach(s -> System.out.println(s));
        hashSet.forEach(System.out::println);

        Student  student = new Student("张三",18);
        //toString

        System.out.println(student);
    }
}
